package com.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

public class UserServiceLogger {
    private static final Logger logger=Logger.getLogger(String.valueOf(UserServiceLogger.class));

    /**
     * 前缀增强代码
     * @param jp
     */
    public void before(JoinPoint jp){
        System.out.println("前置增强：调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法，方法入参："+ Arrays.toString(jp.getArgs()));
      // logger.info("前置增强：调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法，方法入参："+ Arrays.toString(jp.getArgs()));
    }

    /**
     * 后置增强代码
     * @param jp
     * @param result
     */
    public void afterReturning(JoinPoint jp,Object result){
        System.out.println("后置增强：调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值："+result);
      //  logger.info("后置增强：调用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。方法返回值："+result);
    }

    /**
     * 异常抛出增强
     * @param jp
     * @param e
     */
    public void afterThrowing(JoinPoint jp, Throwable e){
        //目标对象
        Object target=jp.getTarget();
        //方法名
        String methodName=jp.getSignature().getName();
        //调用方法的参数
        Object[] args=jp.getArgs();
        System.out.println("异常抛出增强：异常"+target+"的"+methodName+"方法，参数是"+ Arrays.toString(args
        )+"，结果是"+e.getMessage());
    }


    /**
     * 最终增强，类似于finally，无论是否出现异常，都会执行
     * @param jp
     */
    public void afterLogger(JoinPoint jp){
        System.out.println(jp.getSignature().getName()+"方法执行结束。");
    }

    public Object aroundLogger(ProceedingJoinPoint jp){
        System.out.println("【环绕增强前值】：调用"+jp.getTarget()+"的"+jp.getSignature().getName()
        +"方法。方法入参："+Arrays.toString(jp.getArgs()));
        try{
            Object result=jp.proceed(); // 执行目标方法并获得其返回值
            System.out.println("【环绕增后前值】：调用"+jp.getTarget()+"的"+jp.getSignature().getName()
            +"方法。方法返回值："+result);
            return  result; //如果返回的是false，则会添加失败，可以控制代码的结果
        }catch (Throwable e){
           System.out.println(jp.getSignature().getName()+"方法发生异常："+e.getMessage());
        }finally {
           System.out.println(jp.getSignature().getName()+"方法结束执行。");
        }
        return null;
    }
}
